// utils/pdf_utils.go
package utils

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/jung-kurt/gofpdf"
)

// 中文字体文件路径
const (
	FontDir    = "assets/fonts"
	SimHeiPath = "assets/fonts/simhei.ttf"
	SimSunPath = "assets/fonts/simsun.ttf"
	KaiTiPath  = "assets/fonts/kaiti.ttf"
)

// InitPDFFonts 初始化PDF字体
func InitPDFFonts() error {
	// 确保字体目录存在
	if err := ensureFontDir(); err != nil {
		return err
	}

	// 检查字体文件是否存在，不存在则创建示例说明
	if !fileExists(SimHeiPath) {
		createFontPlaceholder(SimHeiPath)
	}
	if !fileExists(SimSunPath) {
		createFontPlaceholder(SimSunPath)
	}
	if !fileExists(KaiTiPath) {
		createFontPlaceholder(KaiTiPath)
	}

	return nil
}

// 确保字体目录存在
func ensureFontDir() error {
	if !dirExists(FontDir) {
		err := os.MkdirAll(FontDir, 0755)
		if err != nil {
			return fmt.Errorf("创建字体目录失败: %v", err)
		}
	}
	return nil
}

// 检查目录是否存在
func dirExists(path string) bool {
	info, err := os.Stat(path)
	if os.IsNotExist(err) {
		return false
	}
	return info.IsDir()
}

// 检查文件是否存在
func fileExists(path string) bool {
	_, err := os.Stat(path)
	return !os.IsNotExist(err)
}

// 创建字体占位文件
func createFontPlaceholder(fontPath string) error {
	fontName := filepath.Base(fontPath)
	content := fmt.Sprintf(`请将 %s 字体文件放在此位置。
您可以从Windows系统的C:\Windows\Fonts目录复制字体文件到此处。
对于Linux系统，您可能需要安装相应的字体包。`, fontName)

	return os.WriteFile(fontPath+".txt", []byte(content), 0644)
}

// 绘制居中表格
func drawCenteredTable(pdf *gofpdf.Fpdf, orderData map[string]interface{}, fontUsed bool) {
	// 定义表格列宽 - 调整列宽以确保右侧有足够留白
	colWidths := []float64{12, 50, 35, 20, 25, 25, 20} // 序号, 商品名称, 型号规格, 数量, 单价, 金额, 备注
	totalTableWidth := 0.0
	for _, width := range colWidths {
		totalTableWidth += width
	}

	// 计算表格起始位置（居中）
	pageWidth, _ := pdf.GetPageSize()
	tableStartX := (pageWidth - totalTableWidth) / 2

	// 表格头部
	pdf.SetFillColor(240, 240, 240)
	pdf.SetX(tableStartX)
	headers := []string{"序号", "商品名称", "型号规格", "数量", "单价", "金额", "备注"}
	for i, header := range headers {
		pdf.CellFormat(colWidths[i], 8, header, "1", 0, "C", true, 0, "")
	}
	pdf.Ln(8)

	// 表格内容
	items, ok := orderData["items"].([]map[string]interface{})
	if !ok {
		items = []map[string]interface{}{}
	}

	for i, item := range items {
		name := getStringValue(item, "name", "")
		spec := getStringValue(item, "spec", "")
		quantity := getStringValue(item, "quantity", "")
		price := getStringValue(item, "price", "")
		amount := getStringValue(item, "amount", "")

		pdf.SetX(tableStartX)
		pdf.CellFormat(colWidths[0], 8, fmt.Sprintf("%d", i+1), "1", 0, "C", false, 0, "")
		pdf.CellFormat(colWidths[1], 8, name, "1", 0, "C", false, 0, "")
		pdf.CellFormat(colWidths[2], 8, spec, "1", 0, "C", false, 0, "")
		pdf.CellFormat(colWidths[3], 8, quantity, "1", 0, "C", false, 0, "")
		pdf.CellFormat(colWidths[4], 8, price, "1", 0, "C", false, 0, "")
		pdf.CellFormat(colWidths[5], 8, amount, "1", 0, "C", false, 0, "")
		pdf.CellFormat(colWidths[6], 8, "", "1", 0, "C", false, 0, "")
		pdf.Ln(8)
	}

	// 合计行 - 修改为与图片一致的格式
	total := getStringValue(orderData, "total", "0.00")
	pdf.SetX(tableStartX)
	pdf.CellFormat(colWidths[0], 8, "合计", "1", 0, "C", false, 0, "")
	pdf.CellFormat(colWidths[1], 8, "", "1", 0, "C", false, 0, "")
	pdf.CellFormat(colWidths[2], 8, "", "1", 0, "C", false, 0, "")
	pdf.CellFormat(colWidths[3], 8, fmt.Sprintf("%d", len(items)), "1", 0, "C", false, 0, "")
	pdf.CellFormat(colWidths[4], 8, "", "1", 0, "C", false, 0, "")
	pdf.CellFormat(colWidths[5], 8, total, "1", 0, "C", false, 0, "")
	pdf.CellFormat(colWidths[6], 8, "", "1", 0, "C", false, 0, "")
	pdf.Ln(8)

	// 合计金额大写 - 作为单独一行并包裹起来
	totalText := getStringValue(orderData, "total_text", "")
	pdf.SetX(tableStartX)

	// 计算总宽度，用于合计金额大写行
	totalRowWidth := 0.0
	for _, width := range colWidths {
		totalRowWidth += width
	}

	// 合计金额大写行
	totalTextContent := "合计金额大写: " + totalText
	pdf.CellFormat(totalRowWidth, 8, totalTextContent, "1", 0, "L", false, 0, "")
	pdf.Ln(8)
}

// CreateOrderPDF 创建订单PDF
func CreateOrderPDF(orderData map[string]interface{}) (*gofpdf.Fpdf, error) {
	// 创建PDF
	pdf := gofpdf.New("P", "mm", "A4", "")
	pdf.AddPage()

	// 尝试加载中文字体
	fontUsed := false
	if fileExists(SimHeiPath) {
		pdf.AddUTF8Font("simhei", "", SimHeiPath)
		pdf.SetFont("simhei", "", 12)
		fontUsed = true
	} else {
		// 使用内置字体
		pdf.SetFont("Arial", "", 12)
	}

	// 获取页面宽度
	pageWidth, _ := pdf.GetPageSize()

	// 添加左上角二维码（如果存在）
	qrCodePath := getStringValue(orderData, "qr_code", "")
	fmt.Printf("PDF生成 - 二维码路径: %s\n", qrCodePath)
	if qrCodePath != "" {
		if fileExists(qrCodePath) {
			// 在左上角添加二维码，尺寸为25x25mm
			pdf.ImageOptions(qrCodePath, 15, 5, 25, 25, false, gofpdf.ImageOptions{ImageType: "JPG", ReadDpi: true}, 0, "")
			fmt.Printf("二维码已添加到PDF\n")
		} else {
			fmt.Printf("二维码文件不存在: %s\n", qrCodePath)
		}
	} else {
		fmt.Printf("没有二维码路径\n")
	}

	// 标题居中 - 使用更精确的居中方法
	pdf.SetFontSize(20)
	titleText := "小徐店"
	titleWidth := pdf.GetStringWidth(titleText)
	titleX := (pageWidth - titleWidth) / 2
	pdf.SetX(titleX)
	pdf.CellFormat(titleWidth, 10, titleText, "", 0, "C", false, 0, "")
	pdf.Ln(10)

	pdf.SetFontSize(18)
	subtitleText := "销售送货单"
	subtitleWidth := pdf.GetStringWidth(subtitleText)
	subtitleX := (pageWidth - subtitleWidth) / 2
	pdf.SetX(subtitleX)
	pdf.CellFormat(subtitleWidth, 10, subtitleText, "", 0, "C", false, 0, "")
	pdf.Ln(15)

	// 客户信息 - 也居中显示
	pdf.SetFontSize(10)
	customer := getStringValue(orderData, "customer", "")
	date := getStringValue(orderData, "date", "")
	orderNo := getStringValue(orderData, "order_no", "")

	// 第一行信息
	info1Text := fmt.Sprintf("客户: %s", customer)
	info1Width := pdf.GetStringWidth(info1Text)
	info1X := (pageWidth - info1Width) / 2
	pdf.SetX(info1X)
	pdf.CellFormat(-info1X-45, 8, info1Text, "", 0, "C", false, 0, "")

	// 第二行信息
	info2Text := fmt.Sprintf("单据日期: %s", date)
	info2Width := pdf.GetStringWidth(info2Text)
	info2X := (pageWidth - info2Width) / 2
	pdf.SetX(info2X)
	pdf.CellFormat(info2Width-50, 8, info2Text, "", 0, "C", false, 0, "")

	// 第三行信息
	info3Text := fmt.Sprintf("单据编号: %s", orderNo)
	info3Width := pdf.GetStringWidth(info3Text)
	info3X := (pageWidth - info3Width) / 2
	pdf.SetX(info3X)
	pdf.CellFormat(info3Width+120, 8, info3Text, "", 0, "C", false, 0, "")
	pdf.Ln(10)

	// 表格居中
	drawCenteredTable(pdf, orderData, fontUsed)

	// 底部信息 - 左右分布
	creator := getStringValue(orderData, "creator", "系统")
	leftText := "制单人: " + creator
	rightText := "客户签字:_____________"

	// 计算左右文本的位置
	leftWidth := pdf.GetStringWidth(leftText)
	rightWidth := pdf.GetStringWidth(rightText)

	// 设置左边距，确保右侧有足够空间
	leftMargin := 20.0
	rightMargin := pageWidth - rightWidth - 20.0

	pdf.SetX(leftMargin)
	pdf.CellFormat(leftWidth, 8, leftText, "", 0, "L", false, 0, "")

	pdf.SetX(rightMargin)
	pdf.CellFormat(rightWidth, 8, rightText, "", 0, "R", false, 0, "")
	pdf.Ln(8)

	return pdf, nil
}

// 获取字符串值，如果不存在或类型不匹配则返回默认值
func getStringValue(data map[string]interface{}, key, defaultValue string) string {
	if value, exists := data[key]; exists {
		if strValue, ok := value.(string); ok {
			return strValue
		}
	}
	return defaultValue
}
